<?php

namespace App\Controllers;

use Framework\Database;
use Framework\Validation;

use Framework\Session;
class UserController{
    protected $db;

    public function __construct()
    {
        $config = require basePath('config/db.php');
        $this->db= new Database($config);
    }
/** 
 * 显示登录页面
 * 方法是加载视图
 * 
 * @return void
 */
    public function login(){
        loadView('users/login');
    }

/** 
 * 显示注册页面
 * 加载注册视图
 * 
 * @return void
 */
    public function create(){
        loadView('users/create');
    }
        /**
     * 把用户数据存储到数据库中
     * 
     * @return void 
     */
    public function store(){
        // 从POST 请求中获取用户数据
        $name = $_POST['name'];
        $email = $_POST['email'];
        $city = $_POST['city'];
        $province = $_POST['province'];
        $password = $_POST['password'];
        $passwordConfirmation = $_POST['password_confirmation'];

        // 初始化一个数组来存放可能的错误信息
        $errors = [];

        //验证电子邮件是否有效
        if(!Validation::email($email)){
            $errors['email'] = '请输入一个合法的电子邮箱地址';
        }

        //验证名字是否子2到50字符之间
        if(!Validation::string($name,2,50)){
            $errors['name'] = '姓名至少为2字符';
        }

        //验证密码是否至少为6位
        if(!Validation::string($password,6,50)){
            $errors['password'] = '密码至少为6位';
        }

        //验证密码和确认密码是否匹配
        if(!Validation::match($password,$passwordConfirmation)){
            $errors['password_confirmation'] = '再次输入的密码不一致';
        }

        //检查是否存在验证错误
        if(!empty($errors)){
            // 如果存在错误，重新加载注册页面并显示错误信息
            loadView('users/create',[
                'errors' => $errors,
                'user'=>[
                    'name'=>$name,
                    'email'=>$email,
                    'city'=>$city,
                    'province'=>$province,
                ]
                ]);
                // 终止进一步执行
                exit;
        }else{
             // 检查电子邮件是否已存在
             $params = [
                'email'=>$email//使用电子邮件作为查询参数
            ];

            $user=$this->db->query('SELECT * FROM users WHERE email = :email',$params)->fetch();

            // 如果查询到用户，（即电子邮件已被注册）
            if($user){
                $errors['email']='该邮箱已注册';//添加错误信息
                //重新加载注册页面并显示错误
                loadView('users/create',[
                    'errors'=>$errors
                ]);
                // 终止；
                exit;
            }

            //创建用户账户
            $params = [
                'name'=>$name,
                'email'=>$email,
                'city'=>$city,
                'province'=>$province,
                'password'=>password_hash($password,PASSWORD_DEFAULT)//对密码进行哈希加密处理
            ];

            //执行sql 插入操作 
            $this->db->query('INSERT INTO users (name,email,city,province,password) VALUES (:name,:email,:city,:province,:password)',$params);

            //Get new user ID
            $userId = $this->db->conn->lastInsertId();

            Session::set('user',[
                'id'=>$userId,
                'email'=>$email,
                'name'=>$name,
                'province'=>$province,
                'city'=>$city,
            ]);

            // 创建成功后重定向到首页
            redirect('/');
        }
    }
        /**
         * 注销用户并结束会话
         * 
         * @return void
         * 
         */

         public function logout(){
            //调用 SEssion 类的 clearAll 方法来清空所有会话数据
            Session::clearAll();
              
  
            ///获取会话  cookie 的参数
            $params = session_get_cookie_params();
            //删除会话 cookie 设置过期时间为当前时间之前一天 确保浏览器删除该 cookie
            setcookie('PHPSESSID','',time()-86400  , $params['path'],$params['domain']);
  
            redirect('/');
           }
                      /**
          * 使用电子邮件和密码验证用户身份
          *此方法首先进行输入验证 然后检查数据库是否存在该电子邮件的用户
          *并验证密码是否正确 如果验证成功，用户信息将被存储在会话中，并重定向到首页
          *@return void 无返回值
          */

          public function authenticate(){
            //从post数据中获取电子邮件和密码
            $email = $_POST['email'];
            $password = $_POST['password'];

            // 初始化错误数组
            $errors = [];

            //验证电子邮件是否有效
            if(!Validation::email($email)){
                $errors['email'] = '请输入一个合法的电子邮箱地址';
            }

            //验证密码是否2到50字符之间
            if(!Validation::string($password,6,50)){
                $errors['password'] = '密码至少为6位';
            }

            // 如果存在验证错误，重新加载登录页面并显示错误信息
            if(!empty($errors)){
                loadView('users/login',[
                    'errors'=>$errors
                ]);
                exit;
            }

            // 准备查询参数，查找电子邮件
            $params = [
                'email'=>$email
            ];

            //从数据库查询用户
            $user = $this->db->query('SELECT * FROM users WHERE email = :email',$params)->fetch();

            // 如果未找到用户，说明电子邮件不正确
            if(!$user){
                $errors['email']='用户不存在或密码错误！';
                loadView('users/login',[[
                    'errors'=>$errors
                ]]);
                exit;
            }

            //验证密码是否正确
            if(!password_verify($password,$user->password)){
                $errors['email']='用户不存在或密码错误！';
                loadView('users/login',[[
                    'errors'=>$errors
                ]]);
                exit;
            }

            // 验证通过，设置用户会话信息
            Session::set('user',[
                'id'=>$user->id,
                'name'=>$user->name,
                'email'=>$user->email,
                'city'=>$user->city,
                'province'=>$user->province,
            ]);

            redirect('/');
          }
}